//实现文件
#include "mystdio.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>


MyFile* ByFile(int fd , int mode)
{
	MyFile* file = (MyFile*)malloc(sizeof(MyFile));// 申请一个结构体对象
	//初始化对象
	file->filenod = fd; 
        file->mode = mode;
        file->bufferlen = 0;
        file->flush_mode = 0; 	

	return file;
}

MyFile* MyFopen(const char *pathname, const char *mode)
{
	//打开文件 -- open
	//判断打开方式
	int fd = -1; // 文件描述符
	int flag = -1;
	if(strcmp(mode , "w") == 0)
	{	
		// w 不存在创建文件 , 清空写入
           flag = O_CREAT | O_WRONLY | O_TRUNC;
	   fd = open(pathname , flag , 0666);	
	}	
	else if(strcmp(mode , "a") == 0)
	{

           flag = O_CREAT | O_WRONLY | O_APPEND;
	   fd = open(pathname , flag , 0666);	
	}
	else if(strcmp(mode , "r") == 0)
	{
		
           flag = O_RDONLY;
	   fd = open(pathname , flag , 0666);	
	}

////  以上文件就成功打开了 , 一旦文件打开 , 就要在内存中申请 FILE 的对象存相关属性
	
	if( fd < 0 ) return NULL; // 打开失败返回空
	
	// 成功返回 , FILE 对象	
	return ByFile(fd , flag);
}
int MyFclose(MyFile* file)
{
	if(file->filenod < 0) return -1;
	//关闭文件之前 , 要刷新缓冲区将内容刷新内存
	MyFFlush(file);
	//关闭文件描述符
	close(file->filenod);	
	//释放 FILE 对象
	free(file);
	file == NULL;
	return 0;
}
int MyFwrite(MyFile * file, void *str, int len)
{	
	// 像文件写入不会直接写入到内存 , 先写入到语言层的缓冲区中
	// 写入的本质就是拷贝
	memcpy(file->outbuffer + file->bufferlen , str , len); // 在缓冲区末端写入
	file->bufferlen += len;
	
	///// 以上写入到了语言层缓冲区 , 所以当满足刷新条件时 , 会进行刷新到内核级缓冲区中
	 if((file->flush_mode & LINE_FLUSH) && file->outbuffer[file->bufferlen-1] == '\n')
   	 {
       		 MyFFlush(file);
   	 }
	    
	return 0;
}
void MyFFlush(MyFile * file)
{
	// 刷新就是把语言层缓冲区的内容拷贝到内核级缓冲区中 , 怎么拷贝 ?? write
	ssize_t rd = write(file->filenod , file->outbuffer , file->bufferlen);
        (void*)rd;	
}
